home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / bsf.jar / com / ibm / cf / CodeFormatter.class (.txt)
Encoding:
Java Class File  |  1999-09-24  |  3.7 KB  |  210 lines

  1. package com.ibm.cf;
  2.  
  3. import com.ibm.cs.util.IndentWriter;
  4. import com.ibm.cs.util.StringUtils;
  5. import java.io.BufferedReader;
  6. import java.io.BufferedWriter;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. import java.io.Reader;
  10. import java.io.Writer;
  11.  
  12. public class CodeFormatter {
  13.    public static final int DEFAULT_MAX = 74;
  14.    public static final int DEFAULT_STEP = 2;
  15.    public static final String DEFAULT_DELIM = "(+";
  16.    public static final String DEFAULT_S_DELIM = ",";
  17.    private int maxLineLength = 74;
  18.    private int indentationStep = 2;
  19.    private String delimiters = "(+";
  20.    private String stickyDelimiters = ",";
  21.    private int indent;
  22.    private int hangingIndent;
  23.    private int origIndent;
  24.    private boolean inCPP_Comment;
  25.  
  26.    public int getMaxLineLength() {
  27.       return this.maxLineLength;
  28.    }
  29.  
  30.    public void setMaxLineLength(int var1) {
  31.       this.maxLineLength = var1 < 0 ? 0 : var1;
  32.    }
  33.  
  34.    public int getIndentationStep() {
  35.       return this.indentationStep;
  36.    }
  37.  
  38.    public void setIndentationStep(int var1) {
  39.       this.indentationStep = var1 < 0 ? 0 : var1;
  40.    }
  41.  
  42.    public String getDelimiters() {
  43.       return this.delimiters;
  44.    }
  45.  
  46.    public void setDelimiters(String var1) {
  47.       this.delimiters = var1;
  48.    }
  49.  
  50.    public String getStickyDelimiters() {
  51.       return this.stickyDelimiters;
  52.    }
  53.  
  54.    public void setStickyDelimiters(String var1) {
  55.       this.stickyDelimiters = var1;
  56.    }
  57.  
  58.    private void printLine(String var1, IndentWriter var2) {
  59.       char[] var3 = var1.toCharArray();
  60.       char var5 = ' ';
  61.       boolean var6 = false;
  62.       boolean var7 = false;
  63.       StringBuffer var8 = new StringBuffer();
  64.       StringBuffer var9 = new StringBuffer(this.hangingIndent + var1.length());
  65.  
  66.       for(int var10 = 0; var10 < var3.length; ++var10) {
  67.          char var4 = var3[var10];
  68.          if (var6) {
  69.             var8.append(var4);
  70.             var6 = false;
  71.          } else if (var7) {
  72.             switch (var4) {
  73.                case '\t':
  74.                   var8.append(var4);
  75.                   break;
  76.                case '"':
  77.                case '\'':
  78.                   var8.append(var4);
  79.                   if (var4 == var5) {
  80.                      this.addTok(var9, var8, var2);
  81.                      var8.setLength(0);
  82.                      var7 = false;
  83.                   }
  84.                   break;
  85.                case '\\':
  86.                   var8.append('\\');
  87.                   var6 = true;
  88.                   break;
  89.                default:
  90.                   if (var4 > 31) {
  91.                      var8.append(var4);
  92.                   }
  93.             }
  94.          } else if (this.inCPP_Comment) {
  95.             var8.append(var4);
  96.             if (var4 == '/' && var10 > 0 && var3[var10 - 1] == '*') {
  97.                this.inCPP_Comment = false;
  98.             }
  99.          } else {
  100.             switch (var4) {
  101.                case '\t':
  102.                   var8.append(StringUtils.getChars(this.indentationStep, ' '));
  103.                   break;
  104.                case '"':
  105.                case '\'':
  106.                   this.addTok(var9, var8, var2);
  107.                   var8.setLength(0);
  108.                   var8.append(var4);
  109.                   var5 = var4;
  110.                   var7 = true;
  111.                   break;
  112.                case '*':
  113.                   var8.append(var4);
  114.                   if (var10 > 0 && var3[var10 - 1] == '/') {
  115.                      this.inCPP_Comment = true;
  116.                   }
  117.                   break;
  118.                case '/':
  119.                   var8.append(var4);
  120.                   if (var10 > 0 && var3[var10 - 1] == '/') {
  121.                      String var11 = var8.append(var3, var10 + 1, var3.length - (var10 + 1)).toString();
  122.                      var2.println(this.indent, var9.append(var11).toString());
  123.                      return;
  124.                   }
  125.                   break;
  126.                case '{':
  127.                   var8.append(var4);
  128.                   this.origIndent += this.indentationStep;
  129.                   break;
  130.                case '}':
  131.                   var8.append(var4);
  132.                   this.origIndent -= this.indentationStep;
  133.                   if (var10 == 0) {
  134.                      this.indent = this.origIndent;
  135.                   }
  136.                   break;
  137.                default:
  138.                   if (var4 > 31) {
  139.                      if (this.delimiters.indexOf(var4) != -1) {
  140.                         this.addTok(var9, var8, var2);
  141.                         var8.setLength(0);
  142.                         var8.append(var4);
  143.                      } else if (this.stickyDelimiters.indexOf(var4) != -1) {
  144.                         var8.append(var4);
  145.                         this.addTok(var9, var8, var2);
  146.                         var8.setLength(0);
  147.                      } else {
  148.                         var8.append(var4);
  149.                      }
  150.                   }
  151.             }
  152.          }
  153.       }
  154.  
  155.       if (var8.length() > 0) {
  156.          this.addTok(var9, var8, var2);
  157.       }
  158.  
  159.       String var12 = var9.toString().trim();
  160.       if (var12.length() > 0) {
  161.          var2.println(this.indent, var12);
  162.       }
  163.  
  164.    }
  165.  
  166.    private void addTok(StringBuffer var1, StringBuffer var2, IndentWriter var3) {
  167.       int var4 = var2.length();
  168.       int var5 = var1.length();
  169.       if (this.indent + var5 + var4 > this.maxLineLength) {
  170.          if (var5 == 0) {
  171.             var3.println(this.indent, var2.toString());
  172.             this.indent = this.hangingIndent;
  173.             var1.setLength(0);
  174.             return;
  175.          }
  176.  
  177.          var3.println(this.indent, var1.toString().trim());
  178.          this.indent = this.hangingIndent;
  179.          var1.setLength(0);
  180.       }
  181.  
  182.       var1.append(var2.toString());
  183.    }
  184.  
  185.    public void formatCode(Reader var1, Writer var2) {
  186.       BufferedReader var4 = new BufferedReader(var1);
  187.       IndentWriter var5 = new IndentWriter(new BufferedWriter(var2), true);
  188.  
  189.       try {
  190.          this.origIndent = 0;
  191.          this.inCPP_Comment = false;
  192.  
  193.          String var3;
  194.          while((var3 = var4.readLine()) != null) {
  195.             var3 = var3.trim();
  196.             if (var3.length() > 0) {
  197.                this.indent = this.origIndent;
  198.                this.hangingIndent = this.indent + this.indentationStep;
  199.                this.printLine(var3, var5);
  200.             } else {
  201.                ((PrintWriter)var5).println();
  202.             }
  203.          }
  204.  
  205.       } catch (IOException var7) {
  206.          ((Throwable)var7).printStackTrace();
  207.       }
  208.    }
  209. }
  210.